#ifndef DATA_STRUCT_CODE_SINGLELINKLIST_H
#define DATA_STRUCT_CODE_SINGLELINKLIST_H

/*单链表*/


// 单链表节点结构体
struct Node {
    int data;
    Node *next;

    Node(int val) : data(val), next(nullptr) {}
};

class SingleLinkList {
public:
    SingleLinkList();                   // 构造函数
    ~SingleLinkList();                  // 析构函数（需要释放内存）

    // 基本操作
    void PushFront(int val);           // 头插法
    void PushBack(int val);            // 尾插法
    void PopFront();                   // 删除头结点
    void PopBack();                    // 删除尾结点

    // 插入与删除
    void Insert(int pos, int val);     // 在指定位置插入，这里约定下，所有的pos都是从1开始
    void Remove(int val);              // 删除第一个等于 val 的节点
    void RemoveAll(int val);           // 删除所有等于 val 的节点

    // 查找与访问
    bool Find(int val) const;          // 查找是否存在 val
    int Get(int pos) const;           // 获取第 pos 个元素
    int Size() const;                 // 返回链表长度
    bool Empty() const;                // 判断是否为空

    // 修改与清空
    void Set(int pos, int val);        // 修改第 pos 个元素
    void Clear();                      // 清空链表

    // 打印
    void Print() const;                // 打印链表元素

private:
    Node *head_;                       // 链表头指针
    int size_;                         // 当前链表大小
};


#endif //DATA_STRUCT_CODE_SINGLELINKLIST_H
